package com.example.newinfinity.View.Layer

import android.graphics.Bitmap
import android.util.Log
import com.example.newinfinity.IconModel.IconModelType

//保存管理所有图层 以及保存与图层相关的方法
class LayerManager {
    private var layers: ArrayList<Layer> = arrayListOf()

    //添加图层
    fun addLayer(mWidth: Int, mHeight: Int) {
        Layer(layers.size + 1, mWidth, mHeight).apply {
            layers.add(this)
        }
    }

    //根据id删除图层
    fun removeLayer(id: Int) {
        layers.forEach { layer ->
            if (layer.id == id) {
                layers.remove(layer)
            }
        }
    }

    //删除最上层的（最新的）图层
    fun removeCurrentLayer() {
        if (layers.isNotEmpty()) {
            layers.removeLast()
        }
    }

    //获取最上层的（最新的）图层
    fun getCurrentLayer(): Layer? {
        if (layers.isEmpty()) return null
        return layers.last()
    }

    //获取所有图层的mBitmap画纸
    fun getBitmaps(): List<Bitmap> {
        val bitmapList = arrayListOf<Bitmap>()
        layers.forEach { layer ->
            bitmapList.add(layer.getBitmap())
        }
        return bitmapList
        Log.v("pxd", "${bitmapList.size}")
    }

    //TODO---
    /*以下方法均是对Layer中方法的封装*/

    //绘制图形时 向mShapes中添加shape 并确认起始绘制点
    fun addShape(type: IconModelType, startX: Float, startY: Float) {
        getCurrentLayer()?.addShape(type, startX, startY)
    }

    //确认绘制图形时的终点位置
    fun addEndPoint(endX: Float, endY: Float) {
        getCurrentLayer()?.addEndPoint(endX, endY)
    }

    //提供给外部统一绘制所有图层中的所有shapes
    fun draw() {
        layers.forEach { layer ->
            layer.draw()
        }
    }

    //撤销最新的shape
    fun undo() {
        getCurrentLayer()?.undo()
    }

    //清空图层中的所有shapes
    fun clear() {
        getCurrentLayer()?.clear()
    }

    //专门提供给橡皮擦显示矩形的显示状态清空方法 DrawView中手up矩形显示及消失
    fun changeEraserRectShowState() {
        getCurrentLayer()?.changeEraserRectShowState()
    }

    //用来判断当前点击点是否在图形的内部 进而选中是否填色
    fun fillColor(x: Float, y: Float) {
        getCurrentLayer()?.fillColor(x, y)
    }

    //用来判断点击点是否在图形移动区域内 进而拖拉点拽操作
    fun changeIconSelectedState(x: Float, y: Float) {
        getCurrentLayer()?.changeIconSelectedState(x, y)
    }

    //传入二次点击时 开始移动的实时坐标
    fun getMoveDistance(x:Float,y:Float){
        getCurrentLayer()?.getMoveDistance(x, y)
    }

    //点击每一个icon图标时 若界面中有移动move的选中图形需要将currentSelectedShape清空并修改其选中状态为MoveType.NONE
    fun clearMoveShape() {
        getCurrentLayer()?.clearMoveShape()
    }
}